package com.itbaizhan.test.abstractClass;

/**
 * 抽象方法与抽象类
 * 抽象方法：1，使用abstract 修饰的方法，没有方法体，只有声明
            2，定义的是一种“规范”，就是告诉子类必须要给抽象方法提供具的实现
 *抽象类：包含抽象方法的类 就是抽象类
         通过抽象类，我们就可以做到 严格限制子类 的设计，使子类之间更加通用
 */

//有抽象方法的类只能定义抽象类
//抽象类不能实例化，也不能用new来实例化抽象类
//抽象类可以包含属性、方法、构造方法。但构造方法不能用来new 实例，只能用来被子类调用
//抽象类只能用来被继承（因为要被子类用）
//抽象方法必须被子类实现

//抽象方法必须是抽象类
public abstract class Animal {
    //抽象类可以有属性
    int age;
    //抽象方法
    public abstract void rest();
    public abstract void run();
    //抽象类可以有普通方法
    public  void eat(){
        System.out.println("Animal.eat");
    //    Animal a = new Animal();   抽象类不可以new
    }
    //构造方法
    public Animal(){
        System.out.println("构造方法");
    }

}
//抽象类只能用来被继承
class Dog extends Animal {
    //需要重写
    @Override
    public void rest() {  //抽象方法必须被子类实现
        System.out.println("Dog.rest");
    }

    @Override
    public void run() {

    }
}
class Cat extends Animal {
//子类都要重写
    @Override
    public void rest() {

    }

    @Override
    public void run() {

    }
}